home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 March / macformat-022.iso / Shareware City / Developers / Jim's CDEFs v1.30 / demo Source ƒ / utilities / movableModal.c < prev    next >
Encoding:
Text File  |  1994-11-06  |  2.5 KB  |  115 lines  |  [TEXT/KAHL]

  1. //----------------------------------------------------------------------------------
  2. //    File        : movableModal.c
  3. //    Date        : April 4, 1994
  4. //    Author        : Jim Stout
  5. //    Purpose        : Implements movableModal dialogs
  6. //------------------------------------------------------------------------------------
  7. #include "movableModal.h"
  8.  
  9. // following must be in your application code!!
  10. // or remove the calls from this code...
  11.  
  12. extern void doUpdate        (EventRecord * theEvent);
  13. extern void doPeriodicEvent    (EventRecord * theEvent);
  14. extern void doMenuCommand    (long menuResult);
  15.  
  16. pascal void movableModalDialog(ModalFilterProcPtr filter, short *theItem)
  17. {
  18.     EventRecord theEvent;
  19.     DialogPtr    d,thisDialog;
  20.     GrafPtr        oldPort;
  21.     
  22.     thisDialog = FrontWindow();
  23.     GetPort(&oldPort);
  24.     SetPort(thisDialog);
  25.     
  26.     for(;;) {
  27.         WaitNextEvent(everyEvent, &theEvent, 20, 0L);
  28.         if( (*theItem = preFilterEvent(thisDialog, &theEvent)) != 0)
  29.             break;
  30.         
  31.         if (filter != nil)
  32.             if (filter(thisDialog, &theEvent, theItem))
  33.                 break;
  34.  
  35.         if (IsDialogEvent(&theEvent))
  36.             if (DialogSelect(&theEvent, &d, theItem))
  37.                 break;
  38.         
  39.         doPeriodicEvent(&theEvent);
  40.     }
  41.     SetPort(oldPort);
  42. }
  43.  
  44. static short preFilterEvent(DialogPtr d, EventRecord *theEvent)
  45. {
  46.     short ret=0;
  47.     
  48.     switch (theEvent->what) {
  49.         case mouseDown:
  50.             ret = doMouseDialog(d,theEvent);     /* handle drag etc. of dialog        */
  51.         break;
  52.         case diskEvt:
  53.             diskEvent(theEvent);
  54.         break;
  55.         case updateEvt:
  56.             if(d != (DialogPtr)theEvent->message)
  57.                 doUpdate(theEvent);                /* pass update evt back to mainline    */
  58.         break;
  59.     }
  60.     return (ret);
  61. }
  62.  
  63. static short doMouseDialog(DialogPtr d, EventRecord *theEvent)
  64. {
  65.     WindowPtr    theWindow;
  66.     short        partCode, ret=0;
  67.     
  68.     switch (partCode = FindWindow(theEvent->where,&theWindow)) {
  69.         case inDrag:
  70.             if(theWindow == d) {
  71.                 DragWindow(d, theEvent->where, &screenBits.bounds);
  72.                 theEvent->what = nullEvent;
  73.             }
  74.         break;
  75.         
  76.         case inMenuBar:
  77.             doMenuCommand(MenuSelect(theEvent->where));
  78.         break;
  79.  
  80.         case inGoAway:
  81.             if (TrackBox (theWindow, theEvent->where, partCode)) {
  82.                 ret = cancel;
  83.                 theEvent->what = nullEvent;
  84.             }
  85.         break;
  86.         
  87. /* add code if you need to deal with these mouseDown events…    */
  88.  
  89.         case inGrow:
  90.         break;
  91.         case inZoomIn:
  92.         case inZoomOut:
  93.         break;
  94.         case inContent:
  95.         break;
  96.         default:
  97.         break;
  98.     }
  99.     return(ret);
  100. }
  101.  
  102. extern void diskEvent(EventRecord *theEvent)
  103. {
  104.     Point diskInitPt;
  105.  
  106.     if (HiWord (theEvent->message) != noErr) {
  107.         diskInitPt.v = 120;
  108.         diskInitPt.h = 100;
  109.         DILoad ();
  110.         (void) DIBadMount (diskInitPt, theEvent->message);
  111.         DIUnload ();
  112.         theEvent->what = nullEvent;
  113.     }
  114. }
  115.